package com.bijava.support;

import cn.org.atool.fluent.mybatis.model.IPagedList;
import com.bijava.model.PageQuery;

import java.io.Serializable;
import java.util.List;

/**
 * @author bishichu
 * @version 1.0
 * @since 20-11-13
 */
public interface BaseService<E, V> {
    /**
     * 根据ID查询记录
     * @param key
     * @return
     */
    V selectByPrimaryKey(Object key);
    /**
     * 根据条件查询一条记录，查询条件为and和=号
     * @param obj
     * @return
     */
    <T> V selectOneByObject(T obj);

    /**
     * 根据条件查询出个数的
     * @param obj
     * @return
     */
    <T> int countByObject(T obj);

    /**
     * 获取排除本身相同条件的个数
     * @param obj
     * @param primaryKey
     * @param primaryValue
     * @return
     */
    <T> int countByObjectExclusiveOwn(T obj, String primaryKey, String primaryValue);

    /**
     * 查询符合条件的所有记录，查询条件为and和=号
     * @param obj
     * @return
     */
    <T> List<V> listByObject(T obj);

    /**
     * 获取全部记录
     * @return
     */
    List<V> listAll();

    /**
     * 单表分页查询
     * @param pageQuery
     * @return
     */
    <T> IPagedList<V> listByPage(PageQuery<T> pageQuery);

    /**
     * 分页查询-动态sql
     * @param pageQuery
     * @param <T>
     * @return
     */
    <T> IPagedList<V> listByPageWithDynamicSql(PageQuery<T> pageQuery);

    /**
     * 保存一条记录
     * @param obj
     * @return
     */
    <T> V insert(T obj);

    /**
     * 仅保存非空字段
     * @param obj
     * @return
     */
    <T> V insertNotNull(T obj);

    /**
     * 批量插入,需自己设置主键
     * @param objList
     * @return
     */
    <T> int insertBatch(List<T> objList);

    /**
     * 批量插入，根据实体@GenId主键策略，自动生成主键
     * @param objList
     * @return
     */
    <T> int insertBatchUseGeneratedKeys(List<T> objList);

    /**
     * 根据ID更新记录
     * @param obj
     * @return
     */
    <T> V updateById(T obj);

    /**
     * 更新不覆盖空值
     * @param obj
     * @return
     */
    <T> V updateNotNull(T obj);

    /**
     * 根据ID删除记录
     * @param key
     * @return
     */
    int deleteById(Serializable key);

    /**
     * 根据匹配条件删除
     * @param obj
     * @return
     */
    <T> int deleteByObject(T obj);

    /**
     * 批量删除，支持复合主键
     * @param objList
     * @return
     */
    <T> int deleteBatchByPK(List<T> objList);
}